#include <iostream>
using namespace std;

int main() {
    bool p, q, formula1, formula2;

    // 输入命题公式
    cout << "Enter the first formula: ";
    cin >> p;
    cin.ignore();  // 忽略掉回车符
    char c1, c2;
    cin >> c1 >> c2;
    cin.ignore();
    cin >> q;
    formula1 = ((c1 == 'a' and c2 == 'n' and c2 == 'd') or (c1 == 'o' and c2 == 'r')) ? ((not p) or q) and (p or q) : false;

    cout << "Enter the second formula: ";
    cin >> p;
    cin.ignore();  // 忽略掉回车符
    cin >> c1 >> c2;
    cin.ignore();
    cin >> q;
    formula2 = ((c1 == 'a' and c2 == 'n' and c2 == 'd') or (c1 == 'o' and c2 == 'r')) ? (not p and q) or (p and not q) : false;

    // 打印两个命题公式的真值表
    cout << endl << "Truth table for formula 1: ";
    if (formula1) {
        cout << "((not p) or q) and (p or q)" << endl;
        cout << "p\tq\tformula 1" << endl;
        cout << "-------------------------" << endl;
        for (p = true; p <= false; p = !p) {
            for (q = true; q <= false; q = !q) {
                formula1 = ((not p) or q) and (p or q);
                cout << p << "\t" << q << "\t" << formula1 << endl;
            }
        }
    } else {
        cout << "Invalid formula 1." << endl;
    }

    cout << endl << "Truth table for formula 2: ";
    if (formula2) {
        cout << "(not p and q) or (p and not q)" << endl;
        cout << "p\tq\tformula 2" << endl;
        cout << "-------------------------" << endl;
        for (p = true; p <= false; p = !p) {
            for (q = true; q <= false; q = !q) {
                formula2 = (not p and q) or (p and not q);
                cout << p << "\t" << q << "\t" << formula2 << endl;
            }
        }
    } else {
        cout << "Invalid formula 2." << endl;
    }

    // 比较两个命题公式的真值表
    if (formula1 and formula2) {
        cout << endl << "Conclusion: the two formulas are ";
        if (formula1 == formula2) {
            cout << "equivalent." << endl;
        } else {
            cout << "not equivalent." << endl;
        }
    }

    return 0;
}
/*在这个示例代码中，我们先要求用户输入两个命题公式。用户输入的命题公式必须以 p 和 q 表示变元，
并且可以包含 and、or、not 等联结词，但是输入的命题公式不能过于复杂。我们用 cin 函数读取用户的输入，并使用 ignore() 函数忽略掉输入结束后留下的回车符。读取联结词时，我们使用两个字符变量 c1 和 c2 来保存输入的联结词。

接下来，我们使用用户输入的命题公式计算它的真值表。我们使用两个 for 循环遍历所有可能的变元取值，并计算每种取值下的命题公式的真值。如果用户输入的命题公式不合法（如没有包含 not 或联结词不合法等），则不打印真值表，直接输出错误信息。

最后，我们比较两个命题公式的真值表。如果两个命题公式都合法，则打印它们是否等价的结论。*/